package com.neuedu.corejava.ch7.abs;
/**
 * <pre>
 * 20190805
 * 1.使用abstract修饰的方法叫抽象方法，抽象方法没有方法体（没有大括号）
 * 2.一个类如果包含有抽象方法，则这个类必须是抽象类；
 *  注意：抽象类不一定包含抽象方法，即抽象类可以不包含抽象方法
 * 3.在抽象类中，可以同时包含抽象方法和非抽象方法
 * 4.抽象类不能使用new关键词进行实例化
 * 5.子类必须实现或重写父类定义的抽象方法，即当需要子类重写或实现方法时，可以把特定的方法声明为抽象方法（对应的类就是抽象类）
 * 6.一个子类继承了一个抽象类，也会继承该父类的抽象方法
 *   如果父类包含有抽象方法，则子类必须实现该方法（子类也是抽象类除外）
 * 7.使用abstract修饰的类叫抽象类，抽象类不能进行实例化
 * </pre>
 * @author admin
 *
 */
//final和abstract不能同时修饰类
//使用final修饰的类称为终止（终结）类，终止（终结）不能被继承，不能有子类
public abstract class AbstracClass {
	
//	private int id;
//	private String name;
	
	//使用final修饰“变量”，成为常量
	//常量就是在运行过程汇总，不能被修改的“变量”
	//属性常量需要在定义时进行初始化，常量一但被初始化，就不能被修改
	//属性常量如果在定义时，如果没有进行初始化，则可以在构造方法中初始化一次
	//
	private final int id;
	private final  String name;
	
	//类属性（使用static修饰的属性）必须在定义时进行初始化，一但被初始化则不能被修改（引用不能被修改）
	public static final String MAN="man";
	
	public AbstracClass() {
		
		super();
		this.id=0;
		this.name="";
		// TODO Auto-generated constructor stub
	}

//	public AbstracClass(int id, String name) {
//		super();
//		this.id = id;
//		this.name = name;
//	}
	//final修饰的局部变量或参数，不能被修改
	public AbstracClass( final int  id, final String name) {
		super();
		final int d;
		d=12;
		//d=3;--错误，局部变量一但被赋值，则不能进行修改
		this.id=id;
		this.name=name;
		
	}

	
	//抽象方法：修饰符号abstract 返回值类型 方法名（参数列表）--没有方法体
	//抽象方法不能使用private关键词进行修饰，其他三个访问修饰符可以
	//抽象方法不能使用static关键词进行修饰，
	//抽象方法不能使用final关键词进行修饰，final修饰的方法不能被重写
	public abstract void absMethod();
	
	//使用final修饰符方法称为终止（终结）方法，终止（终结）方法不能被重写
	public final void print(){
		System.out.println("打印方法");
	}
	public static void main(String[] args) {
		//抽象类一般由非抽象的子类进行实例化，多态编程
		AbstracClass abstracClass=new SubAbstractClass();
		abstracClass.absMethod();
	}


}
